import java.util.Arrays;
import java.util.PriorityQueue;

    public class Test3 {
        // 核心方法：计算最小总等待时间和平均等待时间
        public static double[] calculateMinWaitingTime(int[] serviceTimes, int serverCount) {
            // 1. 按顾客服务时间从小到大排序（贪心核心：短服务优先）
            Arrays.sort(serviceTimes);

            // 2. 优先队列（最小堆）：存储各服务台的当前结束时间
            PriorityQueue<Integer> serverEndTimes = new PriorityQueue<>();
            // 初始化服务台：s个服务台初始结束时间为0
            for (int i = 0; i < serverCount; i++) {
                serverEndTimes.offer(0);
            }

            int totalWaitingTime = 0; // 总等待时间

            // 3. 分配每个顾客到最早空闲的服务台
            for (int time : serviceTimes) {
                // 取最早结束的服务台时间（即当前顾客的等待时间）
                int earliestEnd = serverEndTimes.poll();
                totalWaitingTime += earliestEnd; // 累加等待时间
                // 更新该服务台的结束时间（原结束时间+当前顾客服务时间）
                serverEndTimes.offer(earliestEnd + time);
            }

            // 计算平均等待时间
            double avgWaitingTime = (double) totalWaitingTime / serviceTimes.length;
            return new double[]{totalWaitingTime, avgWaitingTime}; // 返回[总等待时间, 平均等待时间]
        }

        // （主方法用于测试，此处省略输入输出逻辑）
        public static void main(String[] args) {
            int[] times = {3, 1, 4, 2, 5}; // 顾客服务时间数组
            int servers = 2; // 服务台数量
            double[] result = calculateMinWaitingTime(times, servers);
            System.out.println("最小总等待时间：" + (int) result[0]);
            System.out.println("最小平均等待时间：" + result[1]);
        }
    }

